package com.niiwoo.activity.stage.service.prize;

import java.math.BigDecimal;
import java.util.List;

import javax.validation.Valid;
import javax.validation.constraints.NotNull;

import org.hibernate.validator.constraints.NotEmpty;

import com.niiwoo.activity.stage.dto.request.prize.ActiveGuaranteeCashBackReqDTO;
import com.niiwoo.activity.stage.dto.request.prize.ActiveInerestDiscountBackReqDTO;
import com.niiwoo.activity.stage.dto.request.prize.ActiveInerestRateReqDTO;
import com.niiwoo.activity.stage.dto.request.prize.ActiveInvestorCashBackReqDTO;
import com.niiwoo.activity.stage.dto.request.prize.ActiveLoanCashBackReqDTO;
import com.niiwoo.activity.stage.dto.request.prize.ActivityInvestCashbackReqDTO;
import com.niiwoo.activity.stage.dto.request.prize.ActivityInvestRatesReqDTO;
import com.niiwoo.activity.stage.dto.request.prize.ActivityNewInvestRatesReqDTO;
import com.niiwoo.activity.stage.dto.request.prize.ActivityPrizeQueryReqDTO;
import com.niiwoo.activity.stage.dto.request.prize.ActivityPrizeRefinancingReqDTO;
import com.niiwoo.activity.stage.dto.request.prize.ActivityPrizeResetStatusReqDTO;
import com.niiwoo.activity.stage.dto.request.prize.ActivityPrizeStatusReqDTO;
import com.niiwoo.activity.stage.dto.request.prize.ActivityPrizeToBackedReqDTO;
import com.niiwoo.activity.stage.dto.request.prize.PackageInvestOrderFailureReqDTO;
import com.niiwoo.activity.stage.dto.request.prize.PackageInvestPrizeOccupiedReqDTO;
import com.niiwoo.activity.stage.dto.request.prize.PrizeAddInterestReqDTO;
import com.niiwoo.activity.stage.dto.request.prize.PrizeToBackedForCreditorSaleReqDTO;
import com.niiwoo.activity.stage.dto.request.prize.ProjectRaiseAddInterestReqDTO;
import com.niiwoo.activity.stage.dto.request.prize.SummarizeFourthFestivalAddInterestReqDTO;
import com.niiwoo.activity.stage.dto.request.prize.SummarizePrizeAmountReqDTO;
import com.niiwoo.activity.stage.dto.request.prize.SummarizeProjectAddInterestAmountReqDTO;
import com.niiwoo.activity.stage.dto.request.prize.UseInterestDiscountReqDTO;
import com.niiwoo.activity.stage.dto.request.prize.UseInterestRateReqDTO;
import com.niiwoo.activity.stage.dto.request.prize.UseLoanCashBackReqDTO;
import com.niiwoo.activity.stage.dto.request.prize.UserPrizeListReqDTO;
import com.niiwoo.activity.stage.dto.request.project.ProjectRaiseRateInvestReqDTO;
import com.niiwoo.activity.stage.dto.response.prize.InvestorExtraDetailDTO;
import com.niiwoo.activity.stage.dto.response.prize.InvestorExtraDetailSummaryDTO;
import com.niiwoo.activity.stage.dto.response.prize.ProjectAddInterestSummarizeRespDTO;
import com.niiwoo.activity.stage.dto.response.prize.SendOrderDetailRespDTO;
import com.niiwoo.activity.stage.dto.response.prize.SummarizeAmountRespDTO;
import com.niiwoo.activity.stage.dto.response.prize.UserPrizeResponseDTO;

/**
 * @Description 活动红包信息服务接口
 * @Author zq
 * @Date 2017/11/25
 */
public interface ActivityPrizeDubboService {

    /**
     * 查询某个用户、某种类型的可使用红包信息
     *
     * @param requestDTO
     * @return
     */
    List<UserPrizeResponseDTO> getUserPrizeByCondition(ActivityPrizeQueryReqDTO requestDTO);
    
    /**
     * 查询使用红包列表
     * 
     * @param requestDTO
     * @return
     */
    default List<UserPrizeResponseDTO> getUserPrizeList(UserPrizeListReqDTO requestDTO) {
    	throw new UnsupportedOperationException("unimplemented");
    }

    /**
     * 设置红包为占用状态
     *
     * @param requestDTO
     * @return
     */
    boolean setPrizeUsedToOccupied(ActivityPrizeStatusReqDTO requestDTO);

    /**
     * 投资加息券激活，场景：满标
     *
     * @param requestDTO
     *
     * @return
     */
    void activeInterestRatePrize(ActiveInerestRateReqDTO requestDTO);

    /**
     * 投资返现红包激活，场景：满标
     *
     * @param requestDTO
     *
     * @return
     */
    void activeInvestorCashBackPrize(ActiveInvestorCashBackReqDTO requestDTO);

    /**
     * 担保返现红包激活，场景：满标
     *
     * @param requestDTO
     *
     * @return
     */
    void activeGuaranteeCashBackPrize(ActiveGuaranteeCashBackReqDTO requestDTO);

    /**
     * 借款返现红包激活，场景：满标
     *
     * @param requestDTO
     *
     * @return
     */
    void activeLoancashBackPrize(ActiveLoanCashBackReqDTO requestDTO);

    /**
     * 借款人利率折扣卡激活，场景：满标
     *
     * @param requestDTO
     *
     * @return
     */
    void activeInterestDiscountPrize(ActiveInerestDiscountBackReqDTO requestDTO);

    /**
     * 投资加息券返现，场景：投资人回款
     *
     * @param requestDTO
     *
     * @return
     */
    void useInterestRatePrize(UseInterestRateReqDTO requestDTO);

    /**
     * 借款返现红包返现，场景：借款人还款
     *
     * @param requestDTO
     *
     * @return
     */
    void useLoancashBackPrize(UseLoanCashBackReqDTO requestDTO);

    /**
     * 借款人利率折扣卡返现，场景：借款人还款
     *
     * @param requestDTO
     *
     * @return
     */
    void useInterestDiscountPrize(UseInterestDiscountReqDTO requestDTO);

    /**
     * 红包退回
     *
     * @param requestDTO
     * @return
     */
    boolean resetPrizeToReturned(ActivityPrizeResetStatusReqDTO requestDTO);

    /**
     * 设置红包为返现完成(借款利息折扣卡，投资加息券，发果项目逾期或者坏账，需要将剩余期数为已作废)
     *
     * @param requestDTO
     * @return
     */
    void setPrizeToBacked(ActivityPrizeToBackedReqDTO requestDTO);

    /**
     * 查询单个红包信息
     *
     * @param userId
     * @param prizeId
     * @return
     */
    UserPrizeResponseDTO getUserPrizeInfo(@NotNull String userId,@NotNull Long prizeId);

    /**
     * 查询投资加息券详情
     *
     * @param prizeIdList
     * @return
     */
    List<InvestorExtraDetailSummaryDTO> getInvestorExtralDtlSummary(List<Long> prizeIdList);

    /**
     *
     * @param prizeId
     * @return
     */
    List<InvestorExtraDetailDTO> getInvestorExtralDtlSingle(Long prizeId);

    /**
     * 获取标的加息数据
     * @param investOrderId
     * @return
     */
    List<InvestorExtraDetailDTO> getProjectAddInterest(Long investOrderId);

    /**
     * 获取可用投资返现红包ID
     *
     * @param reqDTO
     * @return
     */
    Long getInvestCashbackPrize(@Valid ActivityInvestCashbackReqDTO reqDTO);

    /**
     * 获取可用投资加息券
     *
     * @param reqDTO
     * @return
     */
    Long getInvestRaisePrize(@Valid ActivityInvestRatesReqDTO reqDTO);
    /**
     * 获取可用投资加息券,新规则
     *
     * @param reqDTO
     * @return
     */
    Long getNewInvestRaisePrize(ActivityNewInvestRatesReqDTO reqDTO);

    /**
     * 通过orderNo查询红包信息
     *
     * @param orderNo
     * @return
     */
    UserPrizeResponseDTO getUserPrizeByOderNo(@NotNull Long orderNo);

    /**
     * 获取指定用户的红包总额
     * @param userIds
     * @return
     */
    BigDecimal getTotalInvestPrizeAmountByUsers(@NotEmpty List<String> userIds);


    /**
     * 查询账单需要参数接口
     *
     * @param userId
     * @param requestNo
     * @return
     */
    SendOrderDetailRespDTO getSendPrizeDetailByParams(@NotNull String userId,@NotNull String requestNo);

    /**
     * 仅借新还旧发送红包接口
     *
     * @param reqDTO
     */
    void addRefinancingUserPrize(@Valid ActivityPrizeRefinancingReqDTO reqDTO);


    /**
     * 标的加息生成加息回款计划（满标时调用）
     *
     * @param requestDTO
     *
     * @return
     */
    default void activeProjectInterestRate(ProjectRaiseRateInvestReqDTO requestDTO){};

    /**
     * 债转成功后投资加息红包处理
     * 
     * @param requestDTO
     */
    default void prizeToBackedForCreditorSale(PrizeToBackedForCreditorSaleReqDTO requestDTO) {
    	throw new UnsupportedOperationException("unimplemented");
    }
    
    /**
     * 智能投红包占用（投资调用）
     */
    default void packageInvestPrizeOccupied(PackageInvestPrizeOccupiedReqDTO reqDTO) {
    	throw new UnsupportedOperationException("unimplemented");
    }
    
    /**
     * 智能投失败
     * 
     * @param reqDTO
     */
	default void packageInvestOrderFailure(PackageInvestOrderFailureReqDTO reqDTO) {
    	throw new UnsupportedOperationException("unimplemented");
	}
    
    /**
     * 加息/红包汇总金额
     *  
     * @param reqDTO
     * @return
     */
	default SummarizeAmountRespDTO summarizePrizeAmount(SummarizePrizeAmountReqDTO reqDTO) {
		throw new UnsupportedOperationException("unimplemented");
	}

	/**
	 * 运营活动加息汇总金额
	 * 
	 * @param reqDTO
	 * @return
	 */
	default SummarizeAmountRespDTO summarizeProjectAddInterestAmount(SummarizeProjectAddInterestAmountReqDTO reqDTO) {
		throw new UnsupportedOperationException("unimplemented");
	}
	
	/**
	 * 运营活动
	 * 
	 * @param reqDTO
	 * @return
	 */
	default SummarizeAmountRespDTO summarizeFourthFestivalAddInterestAmount(SummarizeFourthFestivalAddInterestReqDTO reqDTO) {
		throw new UnsupportedOperationException("unimplemented");
	}	
	
	/**
	 * 用户标的加息
	 * 
	 * @param reqDTO
	 * @return
	 */
	default ProjectAddInterestSummarizeRespDTO findProjectRaiseAddInterestInfo(ProjectRaiseAddInterestReqDTO reqDTO) {
		throw new UnsupportedOperationException("unimplemented");
	}
	
	/**
	 * 用户红包加息或返现
	 * 
	 * @param reqDTO
	 * @return
	 */
	default ProjectAddInterestSummarizeRespDTO findProjectPrizeAddInterestInfo(PrizeAddInterestReqDTO reqDTO) {
		throw new UnsupportedOperationException("unimplemented");
	}
}